#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <vector>

class ThreadData
{
public:
    int Add()
    {
        return x + y;
    }
    std::string print()
    {
        std::string ret;
        ret = std::to_string(x) + "+" + std::to_string(y) + "=" + std::to_string(result);
        return ret;
    }
public:
    int x;
    int y;
    int result;
};

// void* ThreadRun(void* args)
// {
//     std::cout << "new thread is running" << std::endl;
//     ThreadData* td = static_cast<ThreadData*>(args);
//     // std::cout << "x=" << td->x << ", y=" << td->y << ", x+y="<< td->Add() << std::endl;
//     // return td;
//     // int ret = 1;
//     // return (void*)ret;

//     ThreadData* ret = new ThreadData();
//     ret->x = td->x;
//     ret->y = td->y;
//     ret->result = td->Add();

//     delete td;
//     return (void*)ret;
// }

// void* ThreadRun(void* args)
// {
//     std::string name = static_cast<const char*>(args);
//     std::cout << name << " is running" << std::endl;
//     sleep(1);
//     return args;
// }

void *ThreadRun(void *args)
{
    // pthread_cancel(pthread_self()); // 取消线程
    // while(1)
    // {
    //     sleep(1);
    // }
    std::string name = static_cast<const char*>(args);
    while(true)
    {
        std::cout << name << " is running" << std::endl;
        sleep(1);
        break;
        // pthread_exit(args); // 从死循环中终止
    }
    return args;
}

int main()
{
    // 创建10个新线程
    std::vector<pthread_t> tids; // 线程 tid
    for (int i = 0; i < 10; i++)
    {
        // 1. 有线程的id
        pthread_t tid;
        // 2. 线程的名字
        char *name = new char[128];
        snprintf(name, 128, "thread-%d", i + 1);
        pthread_create(&tid, nullptr, ThreadRun, name);

        // 3. 保存所有线程的id信息
        tids.emplace_back(tid);
    }

    // 分离线程
    for (auto tid : tids)
    {
        pthread_detach(tid);
    }

    // 主线程等待其他线程
    for (auto tid : tids)
    {
        void *ret = nullptr;
        int n = pthread_join(tid, &ret);
        // std::cout << (const char*)ret << " quit..., n: " << n << std::endl;
        std::cout << (long long)ret << " quit..., n: " << n << std::endl;
        // delete (const char*)name;
    }

    return 0;
}
// int main()
// {
//     // 创建新线程
//     pthread_t tid;
//     int arg1 = 10;
//     pthread_create(&tid, nullptr, ThreadRun, (void*)arg1);

//     // 主线程
//     std::cout << "main process wait..." << std::endl;
//     void* code = nullptr;
//     pthread_join(tid, &code);
//     std::cout << "main process wait sucess, exit code: " << (long long)code <<std::endl;

//     return 0;
// }

// int main()
// {
//     // 创建新线程
//     pthread_t tid;
//     // int arg1 = 10;
//     ThreadData* td = new ThreadData();
//     td->x = 10, td->y = 20;
//     pthread_create(&tid, nullptr, ThreadRun, td); // 新线程1
//     // pthread_create(&tid, nullptr, ThreadRun, &td); // 新线程2

//     // 主线程
//     std::cout << "main process wait..." << std::endl;
//     ThreadData* ret = nullptr;
//     pthread_join(tid, (void**)&ret);
//     std::cout << "main process wait sucess, " << ret->print() << std::endl;

//     delete ret;
//     return 0;
// }